﻿namespace BodaNetCommunications.Utilities.Results
{
    public class BodaResult
    {

        public virtual object Result { get; set; }

        //
        // 摘要:
        //     指示本次访问是否成功
        public bool IsSuccess { get; set; }

        //
        // 摘要:
        //     具体的错误描述
        public string Message { get; set; } = "Unknown";

        //
        // 摘要:
        //     具体的错误代码
        public int ErrorCode { get; set; } = 10000;

        //
        // 摘要:
        //     实例化一个默认的结果对象
        public BodaResult()
        {
        }

        //
        // 摘要:
        //     使用指定的消息实例化一个默认的结果对象
        //
        // 参数:
        //   msg:
        //     错误消息
        public BodaResult(string msg)
        {
            Message = msg;
        }

        //
        // 摘要:
        //     使用错误代码，消息文本来实例化对象
        //
        // 参数:
        //   err:
        //     错误代码
        //
        //   msg:
        //     错误消息
        public BodaResult(int err, string msg)
        {
            ErrorCode = err;
            Message = msg;
        }

        //
        // 摘要:
        //     使用错误代码，消息文本来实例化对象
        //
        // 参数:
        //   err:
        //     错误代码
        //
        //   msg:
        //     错误消息
        public BodaResult(bool state, string msg)
        {
            IsSuccess = state;
            Message = msg;
        }

        //
        // 摘要:
        //     从另一个结果类中拷贝错误信息
        //
        // 参数:
        //   result:
        //     结果类及派生类的对象
        //
        // 类型参数:
        //   TResult:
        //     支持结果类及派生类
        public void CopyErrorFromOther<TResult>(TResult result) where TResult : BodaResult
        {
            if (result != null)
            {
                IsSuccess = false;
                ErrorCode = result.ErrorCode;
                Message = result.Message;
            }
        }

        //
        // 摘要:
        //     创建并返回一个失败的结果对象
        //
        // 返回结果:
        //     失败的结果对象
        public static BodaResult CreateFailedResult(string failedMessage)
        {
            return new BodaResult
            {
                IsSuccess = false,
                ErrorCode = 10000,
                Message = failedMessage
            };
        }

        //
        // 摘要:
        //     创建并返回一个失败的结果对象，该对象复制另一个结果对象的错误信息
        //
        // 参数:
        //   result:
        //     之前的结果对象
        //
        // 类型参数:
        //   T:
        //     目标数据类型
        //
        // 返回结果:
        //     带默认泛型对象的失败结果类
        public static BodaResult<T> CreateFailedResult<T>(BodaResult result)
        {
            return new BodaResult<T>
            {
                IsSuccess = false,
                ErrorCode = result.ErrorCode,
                Message = result.Message
            };
        }

        public static BodaResult<T> CreateFailedResult<T>(string errMessage)
        {
            return new BodaResult<T>
            {
                IsSuccess = false,
                Message = errMessage
            };
        }

        //
        // 摘要:
        //     创建并返回一个成功的结果对象
        //
        // 返回结果:
        //     成功的结果对象
        public static BodaResult CreateSuccessResult()
        {
            return new BodaResult
            {
                IsSuccess = true,
                ErrorCode = 0,
                Message = "Success"
            };
        }

        //
        // 摘要:
        //     创建并返回一个成功的结果对象，并带有一个参数对象
        //
        // 参数:
        //   value:
        //     类型的值对象
        //
        // 类型参数:
        //   T:
        //     参数类型
        //
        // 返回结果:
        //     成功的结果对象
        public static BodaResult<T> CreateSuccessResult<T>(T value)
        {
            return new BodaResult<T>
            {
                IsSuccess = true,
                ErrorCode = 0,
                Message = "Success",
                Content = value
            };
        }
    }
}